package juc.threadpool;

import java.util.concurrent.*;

/**
 * @author Guo
 * @Create 2020/9/1 18:43
 */
public class MyThreadPoolDemo {
    public static void main(String[] args) {
        System.out.println(Runtime.getRuntime().availableProcessors());
        ExecutorService threadPool = new ThreadPoolExecutor(
                2,
                5,
                2L,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardOldestPolicy());
        //new ThreadPoolExecutor.AbortPolicy() 默认 直接抛出RejectedExecutionExecution 异常阻止系统正常运行
        //CallerRunSpolicy 调用者运行 一种调节机制 该策略不会抛出任务，也不抛出异常，而是将某些任务会退到调用者，从而降低新任务得流量
        // DiscardPolicy 默默地丢弃无法处理的任务，不予任何处理也不抛出异常，如果允许任务丢失，这是最好的一种策略
        //DiscardOldstPolicy 抛弃队列中等待最久的任务，然后把当前任务加入队列中，尝试再次提交当前任务
        try {
            //模拟有10个用户过来银行办理业务，目前池子里面有五个工作人员提供服务
            for(int i = 1; i <= 9; i++) {
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "\t 办理业务");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void init() {
        ExecutorService threadPool1 = Executors.newFixedThreadPool(5); // 一个池5个受理线程
        ExecutorService threadPool2 = Executors.newSingleThreadExecutor(); //一池一1个工作线程 类似一个银行有一个受理窗口
        ExecutorService threadPool3 = Executors.newCachedThreadPool(); //一池N个工作线程，类型一个银行有N个受理窗口
        try {
            //模拟有10个用户过来银行办理业务，目前池子里面有五个工作人员提供服务
            for(int i = 1; i <= 10; i++) {
                try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }

                threadPool3.execute(() -> {
                   System.out.println(Thread.currentThread().getName() + "\t 办理业务");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
